/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.edu.eam.persitencia.dao.implementacion;

import co.edu.eam.persitencia.dao.Interfaz.IDAOPaciente;
import co.edu.eam.persitencia.entidades.Acudiente;

import co.edu.eam.persitencia.entidades.EPS;
import co.edu.eam.persitencia.entidades.Paciente;
import co.edu.eam.persitencia.entidades.Persona;

import co.edu.eam.persitencia.entidades.Telefono;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;

/**
 *
 * @author Erika
 */
public class DAOPaciente implements IDAOPaciente{

    
    private EntityManager em;

    /**
     * metodo para conectar a la base de datos
     * @param em EntityManager de la conexion
     */
    public DAOPaciente(EntityManager em) {
        this.em = em;
    }
    
    ////////////////////crear/////////////////////////////////////
    
    /**
     * metodo que crear un Paciente en la Bd
     * @param paciente
     * @throws Exception 
     */
    @Override
    public void crearPaciente(Paciente paciente) throws Exception {
        em.getTransaction().begin();
        em.persist(paciente);
        em.getTransaction().commit();
    } 
    
/**
 * metodo que se encarga de crear un acudiente en la bd
 * @param acudiente
 * @throws Exception 
 */
    @Override
    public void crearAcudiente(Acudiente acudiente) throws Exception {
        em.getTransaction().begin();
        em.persist(acudiente);
        em.getTransaction().commit();
    }
    
    /**
     * metodo que se encarga de crear un telefono en la bd
     * @param telefono
     * @throws Exception 
     */
    @Override
    public void crearTelefono(Telefono telefono) throws Exception {
         em.getTransaction().begin();
        em.persist(telefono);
        em.getTransaction().commit();
    }
    
    

   
   

    
    /////////////////////////editar//////////////////////////////////
    
    /**
     * metodo que se encarga de editar un paciente de la Bd
     * @param paciente
     * @throws Exception 
     */
    @Override
    public void editarPaciente(Paciente paciente) throws Exception {
        em.getTransaction().begin();
        em.merge(paciente);
        em.getTransaction().commit();
    }

    
    /**
     * Metodo que se encarga de editar un Acudiente de la Bd
     * @param acudiente
     * @throws Exception 
     */
    @Override
    public void editarAcudiente(Acudiente acudiente) throws Exception {
        
        em.getTransaction().begin();
        em.merge(acudiente);
        em.getTransaction().commit();
    }

    
    
    
    
    
    //////////////////////eliminar/////////////////////////////////
    /**
     * Metodo que se encarga de eliminar un Paciente de la Bd
     * @param paciente
     * @throws Exception 
     */
    @Override
    public void eliminarPaciente(Paciente paciente) throws Exception {
        
        em.getTransaction().begin();
        em.remove(paciente);
        em.getTransaction().commit();
    }
    
    /**
     * Metodo que se encarga de eliminar un Acudiente de la Bd
     * @param acudiente
     * @throws Exception 
     */
    @Override
    public void eliminarAcudiente(Acudiente acudiente) throws Exception {
        
        em.getTransaction().begin();
        em.remove(acudiente);
        em.getTransaction().commit();
    }
    
    
    /**
     * Metodo que se encarga de eliminar un telefono
     * @param telefono
     * @throws Exception 
     */
    @Override
    public void eliminarTelefono(Telefono telefono) throws Exception {
        
        em.getTransaction().begin();
        em.remove(telefono);
        em.getTransaction().commit();
    }

   
   

    /////////////////////buscar/////////////////////////////////////////
    
    /**
     * Metodo que se encarga de buscar un Paciente por su documento de identificacion
     * @param documento
     * @throws Exception 
     */
    @Override
    public Paciente buscarPaciente(String documento) throws Exception {
       
         return em.find(Paciente.class, documento);
    }

    /**
     * Metodo que se encarga de buscar un Acudiente por su documento de identificacion
     * @param documento
     * @throws Exception 
     */
    @Override
    public Acudiente buscarAcudiente(String documento) throws Exception {
        
       return em.find(Acudiente.class, documento);
    }
     /**
     * Metodo que se encarga de buscar un Acudiente por su documento de identificacion
     * @param documento
     * @throws Exception 
     */
    @Override
    public Telefono buscarTelefono(String numero) throws Exception {
        
       return em.find(Telefono.class, numero);
    }

    

    
    /////////////////////////listar////////////////////////////////////
    /**
     * Metodo que se encarga de listar  todos los Pacientes
     * @return
     * @throws Exception 
     */
    @Override
    public List<Paciente> listarTodosLosPacientes() throws Exception {
        
       Query q=em.createNamedQuery(Paciente.CONSULTA_LISTAR_PACIENTES);
       return q.getResultList();
    }
 
    /**
     * Metodo que se encarga de listar todos los Acudientes de un Paciente determinado.
     * @param paciente
     * @return
     * @throws Exception 
     */
    @Override
    public List<Acudiente> listarAcudientePorPaciente(Paciente paciente) throws Exception {
      
        
        Query q = em.createQuery(Acudiente.CONSULTA_LISTAR_ACUDIENTES_POR_PACIENTE);
        q.setParameter("paciente", paciente);
          List<Acudiente> lista = q.getResultList();
          
          return lista;
    }
    
   
    public void agregarAcudientePaciente (Acudiente acudiente, Paciente p){
        List<Acudiente> j= p.getAcudientes();
        j.add(acudiente);
    }

    /**
     * Metodo que se encarga de eliminar un acudiente de un paciente determinado
     * @param a
     * @param p 
     */
    public void quitarAcudientePaciente (Acudiente a, Paciente p){
        List<Acudiente> j= p.getAcudientes();
        
        for (Acudiente acudiente1 : j) {
            if(acudiente1.getNombre().equals(a.getNombre())){
            
                j.remove(acudiente1);
                
       }
            
        }
    }
    
    
    public void editarAcudienteDePaciente(Acudiente as, Paciente c) throws Exception{
        
        List<Acudiente> pes=c.getAcudientes();
        
        for (Acudiente acudiente1 : pes) {
              editarAcudiente(acudiente1);
               
             }
        }
    
    
    
}
